﻿using System;
using System.Data.Entity;
using System.IO;
using KJSyncXP.Sqlite.Model;
using System.Data.SQLite;
using FreeSql;
using Autofac.Core;

namespace KJSyncXP.SQLite.Context
{
    /*public class SqliteDbContext :IDisposable
    {
        // FreeSQL 核心实例（管理 Access 连接与操作）
        private IFreeSql _freeSql;
        // 标记是否已释放
        private bool _disposed = false;

        /// <summary>
        /// 构造函数（接收连接字符串，初始化 FreeSQL）
        //    "SqliteConnectionString": "Data Source=./SqliteDB/SyncDb.sqlite;Mode=WAL",
        public SqliteDbContext(string sqliteConnString)
        {
            if (string.IsNullOrEmpty(sqliteConnString))
                throw new ArgumentNullException("sqliteConnString", "Sqlite 连接字符串不能为空");

            // 初始化 FreeSQL：指定数据库类型为 OleDb（Access 依赖 OLE DB 驱动）
            _freeSql = new FreeSqlBuilder()
                .UseConnectionString(DataType.Sqlite, sqliteConnString) // DataType.OleDb 适配 Access
                .UseAutoSyncStructure(true) 
                .Build();
        }

        /// <summary>
        /// 对外提供 FreeSQL 实例（用于 CRUD 操作）
        /// </summary>
        public IFreeSql Db => _freeSql;

        /// <summary>
        /// 释放资源（手动调用或 using 自动调用）
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


        /// <summary>
        /// 实际释放逻辑（释放 FreeSQL 连接资源，适配 3.0+ 版本）
        /// </summary>
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed) return;

            // 释放托管资源：FreeSQL 3.0+ 已实现 IDisposable，直接调用 Dispose 即可
            if (disposing && _freeSql != null)
            {
                _freeSql.Dispose(); // 内部自动关闭底层 OleDbConnection + 释放连接池资源
                _freeSql = null;    // 置空避免重复释放
            }

            _disposed = true; // 标记已释放，防止重复调用
        }


        /// <summary>
        /// 析构函数（防止忘记手动释放）
        /// </summary>
        ~SqliteDbContext()
        {
            Dispose(false);
        }

    }*/


    public class SqliteDbContext : IDisposable
    {
        // FreeSQL 核心实例（管理 SQL Server 连接与操作）
        private IFreeSql _freeSql;
        // 标记是否已释放
        private bool _disposed = false;

        /// <summary>
        /// 构造函数（接收连接字符串，初始化 FreeSQL）
        /// </summary>
        public SqliteDbContext(string sqliteConnString)
        {
            try
            {
                if (string.IsNullOrEmpty(sqliteConnString))
                    throw new ArgumentNullException("sqliteConnString", "SQL Server 连接字符串不能为空");

                // 初始化 FreeSQL：指定数据库类型为 SQL Server
                _freeSql = new FreeSqlBuilder()
                    .UseConnectionString(DataType.SqlServer, sqliteConnString) // 使用SQL Server数据库类型
                    .UseAutoSyncStructure(true)
                    .Build();
            }
            catch (Exception ex) {
                throw new Exception("初始化 sqlservr 数据库上下文失败", ex);
            }           
        }

        /// <summary>
        /// 对外提供 FreeSQL 实例（用于 CRUD 操作）
        /// </summary>
        public IFreeSql Db => _freeSql;

        /// <summary>
        /// 释放资源（手动调用或 using 自动调用）
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// 实际释放逻辑（释放 FreeSQL 连接资源，适配 3.0+ 版本）
        /// </summary>
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed) return;

            // 释放托管资源：FreeSQL 3.0+ 已实现 IDisposable，直接调用 Dispose 即可
            if (disposing && _freeSql != null)
            {
                _freeSql.Dispose(); // 内部自动关闭底层 SqlConnection + 释放连接池资源
                _freeSql = null;    // 置空避免重复释放
            }

            _disposed = true; // 标记已释放，防止重复调用
        }

        /// <summary>
        /// 析构函数（防止忘记手动释放）
        /// </summary>
        ~SqliteDbContext()
        {
            Dispose(false);
        }
    }

}